﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace LibNiconico.NiconicoApi.Exceptions
{
    /// <summary>
    /// ニコニコAPIで発生した例外
    /// </summary>
    public sealed class NicoApiException : Exception 
    {

        
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="message"></param>
        public NicoApiException(string message) : base(message) { }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="message"></param>
        /// <param name="internalException"></param>
        public NicoApiException(string message, Exception internalException) : base(message, internalException) { }


        /// <summary>
        /// 認証情報が設定されていないのにAPIを利用した場合の例外を生成
        /// </summary>
        /// <returns></returns>
        public static NicoApiException CreateNotLoginException()
        {
            return new NicoApiException("認証情報が設定されていないのにAPIを利用しようとしました");
        }

        /// <summary>
        /// HTTP通信障害による例外を生成
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        public static NicoApiException CreateHttpException(Exception e)
        {
            return new NicoApiException("Http通信中に何らかの障害が発生したか、もしくはサーバー接続に失敗しました", e);
        }

        /// <summary>
        /// ログイン済例外を生成
        /// </summary>
        /// <returns></returns>
        public static NicoApiException CreateLoggedException()
        {
            return new NicoApiException("すでにニコニコにログインしています");
        }

        /// <summary>
        /// XML解析例外を生成
        /// </summary>
        /// <param name="name"></param>
        /// <param name="internalException"></param>
        /// <returns></returns>
        public static NicoApiException CreateXmlParseException(string name, Exception internalException)
        {
            return new NicoApiException(String.Format("要素:{0}の取得に失敗しました", name), internalException);
        }
    }
}
